﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Podgladokna2
{
    //klasa ma za zadanie przechowywać wektory, ich nazwy(x0,x1). nazwe tabeli, sposób rysowania(połączone kropki albo nie), wartość Y, czyli w przypadku regresji ciągłą a klas jakieś klasy(1,2,3). oraz to czy jest to zbior od regresji czy klas. połowa z tego przyda się tylko mi przy rysowaniu wykresu ale dodajcie tutaj coś co uważacie że będzie potrzebne, mati chyba gdzieś miał przechowywać nazwy klas w stringach(kot,pies). jeszcze tutaj enuma chce zrobić na Type i Connect aby nie trzeba było pamietać od czego jest 0 a od czego 1
    class PointsTable
    {
        private string TableName;//nazwa calej tabeli, byc moze nazwa pliku. czy jak tam chcesz
        private double[,] Table;//tablica punktow(wektory)
        private double[] Y;
        private string[] VariableName;//tablica przechowujaca nazwy zmiennych, naprzyklad x0,x1,x2 ale mozna je zmienic.
        public byte Connect;//0-punkty nie polaczone. 1-punkty polaczone prostymi. 2-funkcja aproksymacyjna
        public byte Type;//0-klasy. 1-regresja


        public PointsTable(int VectorHeight, int VectorWidth, string TableName)//konstruktor z ktorego chyba bedzie sie najczesciej korzystac. dajesz mu wysokosc i szerokosc wektorów oraz nazwe. on tworzy tablice wektorów i Y i zostawia pustą, od Ciebie zależy jak ją wypełnisz
        {
            this.Table = new double[VectorHeight, VectorWidth - 1];
            this.Y = new double[VectorHeight];
            this.TableName = TableName;
            this.VariableName = new string[VectorWidth];
            DefaultVariables();
        }
        public PointsTable(double[,] Table, string TableName)//konstruktor wyluskuje z tablicy [,] wektory oraz Y. tworzy kopie tamtej tablicy
        {
            int WhereIsY = Table.GetLength(1) - 1;//to oznacza ze ostatni element nie jest brany pod uwage w wektorach, ale jest już Y
            this.Table = new double[Table.GetLength(0), WhereIsY];
            this.Y = new double[Table.GetLength(0)];
            for (int i = 0; i < Table.GetLength(0); i++)
            {
                this.Y[i] = Table[i, WhereIsY];
                for (int j = 0; j < WhereIsY; j++)
                    this.Table[i, j] = Table[i, j];
            }
            this.TableName = TableName;
            DefaultVariables();
        }
        public PointsTable(double[][] Table, string TableName)//konstruktor wyluskuje z tablicy [][] wektory oraz Y. tworzy kopie tamtej tablicy
        {
            int WhereIsY = Table[0].Length - 1;//to oznacza ze ostatni element nie jest brany pod uwage w wektorach, ale jest już Y
            this.Y = new double[Table.Length];
            this.Table = new double[Table.Length, WhereIsY];
            for (int i = 0; i < Table.GetLength(0); i++)
            {
                this.Y[i] = Table[i][WhereIsY];
                for (int j = 0; j < WhereIsY; j++)
                    this.Table[i, j] = Table[i][j];
            }
            this.TableName = TableName;
            DefaultVariables();
        }
        public PointsTable(double[,] Table, double[] Y, string TableName)//konstruktor bedzie tylko przechowywal wskazniki
        {
            this.Y = Y;
            this.Table = Table;
            this.TableName = TableName;
            DefaultVariables();
        }
        private void DefaultVariables() //funkcja ustawia domysle wartosci zmiennych. tylko po to aby zmniejszyc wage programu ja napisalem
        {
            this.VariableName = new string[Table.GetLength(1)];
            for (int i = 0; i < this.VariableName.Length; i++)
                this.VariableName[i] = "x" + i.ToString();
            this.Connect = 0;
            this.Type = 1;
        }
        public void SetVariableName(int Index, string Name)
        {
            this.VariableName[Index] = Name;
        }
        public string Name
        {
            get { return TableName; }
        }
        public string GetVariableName(int Index)
        {
            return this.VariableName[Index];
        }
        public double this[int y, int x]
        {
            get { return Table[y, x]; }
            set { Table[y, x] = value; }
        }
        public int GetLength(int Dimension)
        {
            return Table.GetLength(Dimension);
        }

    }
}
